const mongoose = require("mongoose");

mongoose.connect("mongodb://localhost:27017/students_management")
    .then(() => console.log("连接成功"))
    .catch((err) => console.log("连接失败", err));

// ==================== 用户模型 ====================
const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true }, // 用户名（唯一）
  password: { type: String, required: true }, // 加密后的密码
  role: {
    type: String,
    enum: ["admin", "muster", "teacher", "user"],
    required: true,
  }, // 用户角色
  captchaId: { type: String }, // 验证码ID
  captcha: { type: String }, // 验证码Code
  email: { type: String, unique: true }, // 用户邮箱
  phone: { type: String }, // 用户手机号
  lastLogin: { type: Date }, // 最后登录时间
  createdAt: { type: Date, default: Date.now }, // 账户创建时间
});

const User = mongoose.model("user", userSchema, "user");

// ==================== 学生模型 ====================
const studentSchema = new mongoose.Schema({
  studentId: { type: String, unique: true, required: true }, // 学号（如：S20230001）
  name: { type: String, required: true }, // 学生姓名
  gender: { type: String, enum: ["男", "女"], required: true }, // 性别
  academy: { 
    type: String, 
    enum: ["人工智能学院", "数智传媒学院", "云计算学院", "鸿蒙学院", "元宇宙学院", "计算机科学技术学院"],
    required: true 
  }, // 学院
  marketDepartment: { type: String }, // 市场部（如：中原市场部、保沧市场部、辽冀市场部等）
  admissionDate: { type: Date, required: true }, // 入学时间（2024-1-1到2525-10-31）
  class: { type: mongoose.Schema.Types.ObjectId, ref: "class" }, // 所在班级（2401A、2401B、2401C到2510A、2510B、2510C）
  stage: { 
    type: String, 
    enum: ["专业一", "专业二", "专业三", "专业四", "专业五", "专高一", "专高二", "专高三", "专高四", "专高五", "专高六"]
  }, // 所处学段
  dormitory: { type: mongoose.Schema.Types.ObjectId, ref: "dormitory" }, // 所在宿舍
  phone: { type: String, required: true }, // 联系方式-手机号
  status: { 
    type: String, 
    enum: ["在读", "休学", "停课", "毕业"],
    default: "在读"
  }, // 当前状态
  teacherComments: [{
    teacherId: { type: mongoose.Schema.Types.ObjectId, ref: "user" }, // 教师ID
    teacherName: { type: String }, // 教师姓名
    comment: { type: String }, // 评语内容
    commentDate: { type: Date, default: Date.now } // 评语时间
  }], // 教师评语数组
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

const Student = mongoose.model("student", studentSchema, "student");

// ==================== 教师模型 ====================
const teacherSchema = new mongoose.Schema({
  teacherId: { type: String, unique: true, required: true }, // 学工号
  name: { type: String, required: true }, // 姓名
  gender: { type: String, enum: ["男", "女"], required: true }, // 性别
  academy: { 
    type: String, 
    enum: ["人工智能学院", "数智传媒学院", "云计算学院", "鸿蒙学院", "元宇宙学院", "计算机科学技术学院"],
    required: true 
  }, // 所在学院
  phone: { type: String, required: true }, // 联系电话
  status: { 
    type: String, 
    enum: ["在职", "休假", "停职"],
    default: "在职"
  }, // 当前状态
  classes: [{ type: mongoose.Schema.Types.ObjectId, ref: "class" }], // 所带班级
  user: { type: mongoose.Schema.Types.ObjectId, ref: "user" }, // 关联的用户账号
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

const Teacher = mongoose.model("teacher", teacherSchema, "teacher");

// ==================== 班级模型 ====================
const classSchema = new mongoose.Schema({
  className: { type: String, required: true, unique: true }, // 班级名称（如：2401A、2401B等）
  academy: { 
    type: String, 
    enum: ["人工智能学院", "数智传媒学院", "云计算学院", "鸿蒙学院", "元宇宙学院", "计算机科学技术学院"],
    required: true 
  }, // 学院名称
  stage: { 
    type: String, 
    enum: ["专业一", "专业二", "专业三", "专业四", "专业五", "专高一", "专高二", "专高三", "专高四", "专高五", "专高六"]
  }, // 所在阶段
  advisor: { type: mongoose.Schema.Types.ObjectId, ref: "teacher" }, // 导员
  lecturer: { type: mongoose.Schema.Types.ObjectId, ref: "teacher" }, // 讲师
  studentCount: { type: Number, default: 0 }, // 学生人数
  students: [{ type: mongoose.Schema.Types.ObjectId, ref: "student" }], // 学生列表
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

const Class = mongoose.model("class", classSchema, "class");

// ==================== 考勤模型 ====================
const attendanceSchema = new mongoose.Schema({
  serialNumber: { type: Number }, // 序号
  attendanceDate: { type: Date, required: true }, // 考勤日期
  student: { type: mongoose.Schema.Types.ObjectId, ref: "student", required: true }, // 学生
  studentName: { type: String }, // 学生姓名（冗余字段，便于查询）
  class: { type: mongoose.Schema.Types.ObjectId, ref: "class", required: true }, // 所在班级
  className: { type: String }, // 班级名称（冗余字段）
  academy: { type: String }, // 所在学院（冗余字段）
  status: {
    type: String,
    enum: ["正常", "迟到", "早退", "缺席", "请假"],
    required: true,
  }, // 考勤状态
  remark: { type: String }, // 备注
  reviewer: { type: mongoose.Schema.Types.ObjectId, ref: "user" }, // 审核人
  reviewerName: { type: String }, // 审核人姓名
  createdAt: { type: Date, default: Date.now }, // 创建时间
});

const Attendance = mongoose.model("attendance", attendanceSchema, "attendance");

// ==================== 成绩模型 ====================
const gradeSchema = new mongoose.Schema({
  student: { type: mongoose.Schema.Types.ObjectId, ref: "student", required: true }, // 学生
  class: { type: mongoose.Schema.Types.ObjectId, ref: "class", required: true }, // 班级
  subject: { type: String, required: true }, // 科目
  score: { type: Number, required: true, min: 0, max: 100 }, // 分数
  examType: { 
    type: String, 
    enum: ["周考1", "周考2", "周考3", "月考", "教学月"],
    required: true 
  }, // 考试类型
  teachingMonth: { type: String }, // 教学月
  academy: { type: String }, // 学院
  instructor: { type: mongoose.Schema.Types.ObjectId, ref: "teacher" }, // 任课教师
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

// 班级成材率计算（成绩80分以上为成才）
gradeSchema.statics.getClassSuccessRate = async function(classId) {
  const grades = await this.find({ class: classId });
  if (grades.length === 0) return 0;
  const successCount = grades.filter(g => g.score >= 80).length;
  return (successCount / grades.length * 100).toFixed(2);
};

const Grade = mongoose.model("grade", gradeSchema, "grade");

// ==================== 宿舍模型 ====================
const dormitorySchema = new mongoose.Schema({
  building: { 
    type: String, 
    enum: ["皇悦一期", "皇悦三期", "学一舍", "学二舍", "学三舍", "学四舍", "学五舍", "11舍", "12舍", "13舍"],
    required: true 
  }, // 宿舍楼
  floor: { type: Number, required: true }, // 楼层
  roomNumber: { type: String, required: true }, // 宿舍号
  capacity: { type: Number, default: 8 }, // 容量（8人间）
  students: [{ type: mongoose.Schema.Types.ObjectId, ref: "student" }], // 宿舍人员
  comment: { type: String }, // 宿舍评语
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

// 复合唯一索引：同一栋楼同一层同一房间号唯一
dormitorySchema.index({ building: 1, floor: 1, roomNumber: 1 }, { unique: true });

const Dormitory = mongoose.model("dormitory", dormitorySchema, "dormitory");

// ==================== 市场部模型 ====================
const marketDepartmentSchema = new mongoose.Schema({
  name: { type: String, required: true, unique: true }, // 市场部名称（如：中原市场部、保沧市场部、辽冀市场部等）
  manager: { type: String }, // 负责人
  studentCount: { type: Number, default: 0 }, // 学生人数
  graduateStatus: [{ // 毕业生现状
    year: { type: String }, // 毕业年份
    totalGraduates: { type: Number, default: 0 }, // 毕业生总数
    employed: { type: Number, default: 0 }, // 已就业
    unemployed: { type: Number, default: 0 }, // 未就业
    furtherEducation: { type: Number, default: 0 } // 继续深造
  }],
  createdAt: { type: Date, default: Date.now }, // 创建时间
  updatedAt: { type: Date, default: Date.now }, // 更新时间
});

const MarketDepartment = mongoose.model("marketDepartment", marketDepartmentSchema, "marketDepartment");

// ==================== 角色权限模型 ====================
const roleSchema = new mongoose.Schema({
  roleId: { type: String, unique: true, required: true }, // 角色Id
  roleName: { 
    type: String, 
    enum: ["系统管理员", "院长", "主任", "讲师", "导员", "教务人员"],
    required: true,
    unique: true 
  }, // 角色名称
  description: { type: String }, // 角色描述
  permissions: [{ type: String }], // 拥有权限（权限数组）
  userCount: { type: Number, default: 0 }, // 用户数量
  updatedAt: { type: Date, default: Date.now }, // 修改时间
  createdAt: { type: Date, default: Date.now }, // 创建时间
});

const Role = mongoose.model("role", roleSchema, "role");

// ==================== 审计日志模型 ====================
const auditLogSchema = new mongoose.Schema({
  serialNumber: { type: Number }, // 序号
  timestamp: { type: Date, default: Date.now }, // 时间
  user: { type: mongoose.Schema.Types.ObjectId, ref: "user" }, // 用户
  userId: { type: String }, // 用户Id（冗余字段）
  username: { type: String }, // 用户名（冗余字段）
  action: { type: String, required: true }, // 操作（如：创建、修改、删除等）
  module: { type: String, required: true }, // 模块（如：学生管理、教师管理等）
  description: { type: String }, // 描述
  ipAddress: { type: String }, // IP地址
  status: { 
    type: String, 
    enum: ["成功", "失败"],
    default: "成功"
  }, // 状态
});

const AuditLog = mongoose.model("auditLog", auditLogSchema, "auditLog");

// ==================== 导出模型 ====================
module.exports = {
  User,
  Student,
  Teacher,
  Class,
  Dormitory,
  Attendance,
  Grade,
  MarketDepartment,
  Role,
  AuditLog,
};
